package com.tz.crm.service;


import com.tz.crm.entity.Customer;
import com.tz.crm.entity.User;
import com.tz.crm.entity.enumeration.Level;
import com.tz.crm.entity.enumeration.Source;
import com.tz.crm.entity.enumeration.Status;
import com.tz.crm.utils.Pager;

import java.util.Date;
import java.util.List;

/**
 * CustomerService 接口
 * 客户的增删改查以及分页查询
 */
public interface CustomerService extends BaseService<Customer, String> {

    /**
     * 根据业务员查询公海中是否有相关的客户
     *
     * @param customer Customer
     * @param pager    Pager
     * @param levels   Level List
     * @param sources  Source List
     * @return Pager Customer
     */
    Pager<Customer> getByPager(Customer customer, Pager pager, List<Level> levels, List<Source> sources);

    /**
     * 根据客户设置主联系人
     *
     * @param customer Customer
     */
    void saveLinkedContact(Customer customer);

    /**
     * 根据客根据员工将客户放入公海
     *
     * @param customer    Customer
     * @param loginUserId loginUserId
     */
    void backSea(Customer customer, String loginUserId);

    /**
     * 查询所有公海客户
     *
     * @return Customer List
     */
    List<Customer> getAllSea();

    /**
     * 查询未签约客户
     *
     * @param pager Pager
     * @return Pager
     */
    Pager getAllSeaByPager(Pager pager);

    /**
     * 根据客户拜访方式，等级，是否第一次拜访、客户状态，以及员工查询
     *
     * @param customer   Customer
     * @param pager      Pager
     * @param ownerList  客户专员
     * @param sourceList 来源
     * @param levelList  等级
     * @param user       员工
     * @return Pager
     */
    Pager<Customer> getByPager(Customer customer, Pager pager, List<User> ownerList,
                               List<Source> sourceList, List<Level> levelList, User user);

    /**
     * 根据客户拜访方式，等级，是否第一次拜访、客户状态，以及员工查询
     *
     * @param customer   customer
     * @param pager      pager
     * @param ownerList  ownerList
     * @param sourceList sourceList
     * @param levelList  levelList
     * @param user       user
     * @return Pager
     */
    Pager<Customer> search(Customer customer, Pager pager, List<User> ownerList,
                           List<Source> sourceList, List<Level> levelList, User user);

    /**
     * 根据客户的 姓名，等级，拜访方式，来源，地址，以及客户状态查询
     *
     * @param customer   customer
     * @param pager      pager
     * @param levelList  levelList
     * @param sourceList sourceList
     * @return Pager
     */

    /**
     * 根据 Id 删除 Customer（同时删除下属联系人）
     *
     * @param id Customer Id
     */
    void deleteIncludeContacts(String id);

    /**
     * 根据传入的省份名字查询所匹配的客户信息
     *
     * @param provinceName provinceName
     * @return Customer List
     */
    List<Customer> getByProvinceName(String provinceName);

    /**
     * 根据客户的等级，名称，状态，地址，专员，来源,日期进行查询
     *
     * @param customer   customer
     * @param pager      pager
     * @param ownerList  ownerList
     * @param sourceList sourceList
     * @param levelList  levelList
     * @param user       user
     * @param statusList statusList
     * @param fromDate   fromDate
     * @param toDate     toDate
     * @return Pager
     */
    Pager<Customer> getByPager(Customer customer, Pager pager, List<User> ownerList,
                               List<Source> sourceList, List<Level> levelList, User user,
                               List<Status> statusList, Date fromDate, Date toDate);

    /**
     * 根据客户的等级，名称，状态，地址，来源进行查询
     *
     * @param customer   customer
     * @param pager      pager
     * @param levelList  levelList
     * @param sourceList sourceList
     * @param statusList statusList
     * @return Pager
     */
    Pager<Customer> getByPager(Customer customer, Pager pager, List<Level> levelList,
                               List<Source> sourceList, List<Status> statusList);

    /**
     * 根据customer 查询地址
     * 给公海客户查询的 提供的方法
     * @param customer
     * @param pager
     * @return
     */
    Pager<Customer> getByPager(Customer customer, Pager pager);
}
